﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Administration.Entities;
using HerGoS.DAO;
using HerGoS.Interfaces;
using System.Data;
using HerGoS.Administration.Exceptions.Parametrizacion;

namespace HerGoS.Administration.Engine
{
    public class GestorProvincia
    {
        private Provincia provin;

        public static Provincia Obtener(int OID)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "PROVINCIAS_SP";
                repo.AddParameter("@ACCION", "BYID");
                repo.AddParameter("@ID", OID);

                DataTable dt = repo.ExecuteDataTable();
                Provincia result = dt.ToGenericList<Provincia>(ProvinciaConverter).FirstOrDefault();
                return result;
            }
            catch (Exception ex)
            {
                throw new ProvinciaGetException(ex);
            }
        }

   


        public static void Guardar(Provincia provincia)
        {

            //TODO:  Validar si vienen Ids de Pais y Zona y crear y lanzar excepcion si no se cumple.
            try
            {
                IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryName);
                repo.Nombre = "PROVINCIAS_PROC";
                repo.AddParameter("@ACCION", provincia.Persistencia);
                repo.AddParameter("@ID", provincia.OID);
                repo.AddParameter("@CODIGO", provincia.Codigo);
                repo.AddParameter("@NUMERO", provincia.Numero);
                repo.AddParameter("@NOMBRE", provincia.Nombre);
                repo.AddParameter("@PAIS", provincia.Pais.OID);
                repo.AddParameter("@ZONA", provincia.Zona == null ? (int?)null : provincia.Zona.OID);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                provincia.OID = repo.ExecuteReturnValue().ToInteger();

                repo.Commit();
                GestorBitacora.Guardar(provincia);

            }
            catch (Exception ex)
            {
                throw new ProvinciaSetException(ex);
            }
        }

        public static void Eliminar(Provincia provincia)
       
        {
            provincia.Persistencia = EstadoPersistencia.DELETE;
            Guardar(provincia);
            provincia.Persistencia = EstadoPersistencia.UPDATE;
            provincia.Activo = false;
        }
        public static void ReActivar(Provincia provincia)
        {
            provincia.Persistencia = EstadoPersistencia.UNDELETE;
            Guardar(provincia);
            provincia.Persistencia = EstadoPersistencia.UPDATE;
            provincia.Activo = true;
        }
        public static List<Provincia> Consultar(string codigo, int? numero, string nombre, int? idPais , int? idZona, bool? activo)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "PROVINCIAS_SP";
                repo.AddParameter("@ACCION", "CONSULTA");
                repo.AddParameter("@ID", null);
                repo.AddParameter("@CODIGO", codigo);
                repo.AddParameter("@NUMERO", numero);
                repo.AddParameter("@NOMBRE", nombre);
                repo.AddParameter("@PAIS", idPais);
                repo.AddParameter("@ZONA", idZona);
                repo.AddParameter("@ACTIVO", activo);
                DataTable dt = repo.ExecuteDataTable();
                List<Provincia> result = dt.ToGenericList<Provincia>(ProvinciaConverter);
                return result;
            }
            catch (Exception ex)
            {
                throw new ProvinciaGetException(ex);
            }
        }


        /// <summary>
        /// Permite consultar los provincias
        /// </summary>
        /// <returns>Lista de Provincias</returns>
        public static List<Provincia> Consultar()
        {
            return Consultar(null, null, null, null,null,null);
        }

        /// <summary>
        /// Permite Consultar los Provincias Activas
        /// </summary>
        /// <param name="codigo">Codigo, o parte de el, del pais a consultar</param>
        /// <param name="nombre">Nombre, o parte de el, del pais a consultar</param>
        /// <returns>Todos los paises que coincidan con los filtros</returns>
        public static List<Provincia> Consultar(string codigo, int? numero, string nombre, int? idPais, int? idZona)
        {
            return Consultar(codigo,numero, nombre,idPais , idZona, true);
        }
        /// <summary>
        /// Consultar Provincias por Estado
        /// </summary>
        /// <param name="activo"></param>
        /// <returns></returns>
        public static List<Provincia> Consultar(bool activo)
        {
            return Consultar(null, null,null,null,null, activo);
        }


        public static List<Provincia> Consultar(int idPais)
         {

             return Consultar(null, null, null, idPais, null, true);
         }

        #region Converter
        public static Provincia ProvinciaConverter(DataRow row)
        {
            return new Provincia
            {
                OID = row["provID"].ToInteger(),
                Persistencia = EstadoPersistencia.UPDATE,
                Codigo = row["provCODIGO"].ToString(),
                Numero = row["provNUMERO"].ToInteger(),
                Nombre = row["provNOMBRE"].ToString(),
                //PaisID = row[""]
                Pais = GestorPaises.Obtener(row["provIDPAIS"].ToInteger()),
                Zona = GestorZona.Obtener(row["provIDZONA"].ToInteger()),
                Activo = row.IsNull("FECHA_BAJA") ? true : false
            };

        }
        
        //TODO : LAZY LOAD 
        //public static Pais GetPais()
        //{
        //    //int idpais = provin. ;
        //    //return GestorPaises.Obtener(idpais);
        //    throw new NotImplementedException();
        //}

        //public static Zona GetZona(int idzona)
        //{

        //    return GestorZona.Obtener(idzona);
        //}






       #endregion




    }
}
